/**
 * 银行卡号进行Luhn规则的合法校验
 * @param {*} card_num
 * @returns
 */
function isLuhn(card_num) {
	let s = 0
	const card_num_length = card_num.length
	for (let i = 1; i < card_num_length + 1; i++) {
		let t = parseInt(card_num[card_num_length - i])

		if(i % 2 == 0) {
			t *= 2
			s += t < 10 ? t : t % 10 + parseInt((t/10) % 10)
		} else {
			s += t
		}
	}
	return s % 10 == 0
}

function isIdCard(idCard) {
  if(!idCard || idCard.length!=18){
      return false;
  }
  /*
   * 11北京| 12天津| 13河北| 14山西| 15内蒙古|21辽宁| 22吉林| 23黑龙江|31上海| 32江苏| 33浙江|
   * 34安徽| 35福建| 36江西| 37山东| 41河南| 42湖北| 43湖南| 44广东| 45广西| 46海南| 50重庆|
   * 51四川| 52贵州| 53云南| 54西藏| 61陕西| 62甘肃| 63青海| 64宁夏| 65新疆|
   * (未加入限制：71台湾|81香港|82澳门|91国外)
   */
  // 粗略的校验
  var regex = /^(11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65)(\d{4})(19|20|21)(\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\d{3})(\d{1}|X|x)$/;
  return regex.test(idCard);
}
/**
 * 身份证最后一位校验码校验
 * @param {*} idCard 身份证
 * @returns
 */
function isIdCardStrict(idCard) {
  if (!isIdCard(idCard)) { // 先进行粗略校验
      return false;
  }
  /* 粗略校验通过后，必定有18位字符，对身份证的最后一位校验码进行验证 */
  var prefix = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); // 加权因子数组
  var suffix = new Array( "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" ); // 校验码数组，其中X为10
  var wiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
  for (var i = 0; i < 17; i++) {
      wiSum += parseInt(idCard[i]) * prefix[i];
  }
  var wiMod = wiSum % 11; // 计算出校验码所在数组的位置
  var code = suffix[wiMod]; // 从数组中得到校验码，如果wiMod等于2，则说明校验码是10，身份证号码最后一位应该是X
  var idCardLast = idCard[17].toUpperCase(); // 获取身份证号码的最后一位，最后一位是校验码
  // 用计算出来的校验码与最后一位身份证号码比较，如果相等，说明验证通过，否则是无效的身份证号码
  return (code==idCardLast);
}


export default {
  isLuhn,
  isIdCardStrict
}
